from tkinter import *
import parser
import math
root = Tk()
root.title("Calculator")
def tmp_cmd():
text = display.get()
if text:
print(text)
pass
def get_factorial(num):
'''
Factorial:
n = n*(n-1)!
'''
if num == 0:
return 0
elif num == 1:
return num
else:
return(num * get_factorial(num-1))
# position of the last character on display
pos = 0
def check_error_from_display():
global pos
if display.get() == "ERROR":
clear_display()
pos = 0
def put_digit(num):
global pos
check_error_from_display()
display.insert(pos, num)
pos += 1
def put_operator(operator):
global pos
check_error_from_display()
display.insert(pos, operator)
pos += len(operator)
def clear_display():
global pos
display.delete(0, END)
pos = 0
def remole_last_digit():
global pos
check_error_from_display()
if pos > 0:
display.delete(pos-1)
pos -= 1
def get_result():
global pos
statement = display.get()
clear_display()
if statement[-1:] == "!":
# factorial: num must be integer and positive
num = int(float(statement[:-1]))
if num > 0:
result = get_factorial(num)
display.insert(0, result)
pos = len(str(result)) + 1
else:
display.insert(0, "ERROR")
else:
try:
prep = parser.expr(statement).compile()
result = eval(prep)
display.insert(0, result)
pos = len(str(result)) + 1
except Exception:
display.insert(0, "ERROR")
display = Entry(root)
display.grid(row=1, columnspan=6, sticky=W+E, pady=4)
btn_widh = 5
func_btn_color = "#F9A602"
Button(text="1", width=btn_widh, command=lambda: put_digit(1)).grid(row=2, column=0)
Button(text="2", width=btn_widh, command=lambda: put_digit(2)).grid(row=2, column=1)
Button(text="3", width=btn_widh, command=lambda: put_digit(3)).grid(row=2, column=2)
Button(text="4", width=btn_widh, command=lambda: put_digit(4)).grid(row=3, column=0)
Button(text="5", width=btn_widh, command=lambda: put_digit(5)).grid(row=3, column=1)
Button(text="6", width=btn_widh, command=lambda: put_digit(6)).grid(row=3, column=2)
Button(text="7", width=btn_widh, command=lambda: put_digit(7)).grid(row=4, column=0)
Button(text="8", width=btn_widh, command=lambda: put_digit(8)).grid(row=4, column=1)
Button(text="9", width=btn_widh, command=lambda: put_digit(9)).grid(row=4, column=2)
Button(text="AC", width=btn_widh, command=clear_display, bg=func_btn_color).grid(row=5, column=0)
Button(text="0", width=btn_widh, command=lambda: put_digit(0)).grid(row=5, column=1)
Button(text="=", width=btn_widh, command=lambda: get_result(), bg=func_btn_color).grid(row=5, column=2)
Button(text="+", width=btn_widh, command=lambda: put_operator("+"), bg=func_btn_color).grid(row=2, column=3)
Button(text="-", width=btn_widh, command=lambda: put_operator("-"), bg=func_btn_color).grid(row=3, column=3)
Button(text="*", width=btn_widh, command=lambda: put_operator("*"), bg=func_btn_color).grid(row=4, column=3)
Button(text="/", width=btn_widh, command=lambda: put_operator("/"), bg=func_btn_color).grid(row=5, column=3)
Button(text="pi", width=btn_widh, command=lambda: put_operator("3.14"), bg=func_btn_color).grid(row=2, column=4)
Button(text="%", width=btn_widh, command=lambda: put_operator("%"), bg=func_btn_color).grid(row=3, column=4)
Button(text="(", width=btn_widh, command=lambda: put_operator("("), bg=func_btn_color).grid(row=4, column=4)
Button(text="exp", width=btn_widh, command=lambda: put_operator("**"), bg=func_btn_color).grid(row=5, column=4)
Button(text="<-", width=btn_widh, command=lambda: remole_last_digit(), bg=func_btn_color).grid(row=2, column=5)
Button(text="x!", width=btn_widh, command=lambda: put_operator("!"), bg=func_btn_color).grid(row=3, column=5)
Button(text=")", width=btn_widh, command=lambda: put_operator(")"), bg=func_btn_color).grid(row=4, column=5)
Button(text="^2", width=btn_widh, command=lambda: put_operator("**2"), bg=func_btn_color).grid(row=5, column=5)
[root.grid_rowconfigure(row, pad=4, minsize=24) for row in range(2,6)]
[root.grid_columnconfigure(col, pad=4, minsize=24) for col in range(0,6)]
# root.mainloop()